package com.java.second_goods.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.java.second_goods.common.utils.DateUtils;
import com.java.second_goods.common.utils.StringUtils;
import com.java.second_goods.entity.Coupon;
import com.java.second_goods.entity.UserCoupon;
import com.java.second_goods.mapper.CouponMapper;
import com.java.second_goods.mapper.UserCouponMapper;
import com.java.second_goods.service.CouponService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 优惠券 服务层实现
 */
@Service
public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements CouponService {

    @Autowired
    private CouponMapper couponMapper;

    @Autowired
    private UserCouponMapper userCouponMapper;

    /**
     * 查询优惠券信息
     *
     * @param id 优惠券ID
     * @return 优惠券信息
     */
    @Override
    public Coupon selectCouponById(Integer id) {
        return couponMapper.selectById(id);
    }

    /**
     * 查询优惠券列表
     *
     * @param coupon 优惠券信息
     * @return 优惠券集合
     */
    @Override
    public List<Coupon> selectCouponList(Coupon coupon) {
        LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();

        // 构建查询条件
        if (coupon != null) {
            if (StringUtils.isNotEmpty(coupon.getTitle())) {
                queryWrapper.like(Coupon::getTitle, coupon.getTitle());
            }
            if (StringUtils.isNotEmpty(coupon.getCategory())) {
                queryWrapper.eq(Coupon::getCategory, coupon.getCategory());
            }
            if (coupon.getStatus() != null) {
                queryWrapper.eq(Coupon::getStatus, coupon.getStatus());
            }
            if (coupon.getStartDate() != null) {
                queryWrapper.ge(Coupon::getStartDate, coupon.getStartDate());
            }
            if (coupon.getExpireDate() != null) {
                queryWrapper.le(Coupon::getExpireDate, coupon.getExpireDate());
            }
        }

        // 按创建时间降序排列
        queryWrapper.orderByDesc(Coupon::getCreateTime);

        return couponMapper.selectList(queryWrapper);
    }

    /**
     * 查询有效的优惠券列表
     *
     * @return 优惠券列表
     */
    @Override
    public List<Coupon> selectValidCoupons() {
        return couponMapper.selectValidCoupons();
    }

    /**
     * 查询用户优惠券列表
     *
     * @param userId 用户ID
     * @return 用户优惠券列表
     */
    @Override
    public List<UserCoupon> selectUserCoupons(Integer userId) {
        return userCouponMapper.selectUserCoupons(userId);
    }

    /**
     * 查询用户未使用的优惠券列表
     *
     * @param userId 用户ID
     * @return 用户优惠券列表
     */
    @Override
    public List<UserCoupon> selectUnusedUserCoupons(Integer userId) {
        return userCouponMapper.selectUnusedUserCoupons(userId);
    }

    /**
     * 查询用户已使用的优惠券列表
     *
     * @param userId 用户ID
     * @return 用户优惠券列表
     */
    @Override
    public List<UserCoupon> selectUsedUserCoupons(Integer userId) {
        return userCouponMapper.selectUsedUserCoupons(userId);
    }

    /**
     * 查询可用的优惠券列表
     *
     * @param userId 用户ID
     * @param amount 消费金额
     * @return 优惠券列表
     */
    @Override
    public List<Coupon> selectAvailableCoupons(Integer userId, BigDecimal amount) {
        return couponMapper.selectAvailableCoupons(userId, amount);
    }

    /**
     * 新增优惠券
     *
     * @param coupon 优惠券信息
     * @return 结果
     */
    @Override
    public int insertCoupon(Coupon coupon) {
        // 设置默认值
        if (coupon.getStatus() == null) {
            coupon.setStatus(1);
        }
        return couponMapper.insert(coupon);
    }

    /**
     * 修改优惠券
     *
     * @param coupon 优惠券信息
     * @return 结果
     */
    @Override
    public int updateCoupon(Coupon coupon) {
        return couponMapper.updateById(coupon);
    }

    /**
     * 删除优惠券信息
     *
     * @param id 优惠券ID
     * @return 结果
     */
    @Override
    public int deleteCouponById(Integer id) {
        return couponMapper.deleteById(id);
    }

    /**
     * 批量删除优惠券信息
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteCouponByIds(Integer[] ids) {
        return couponMapper.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 更新优惠券状态
     *
     * @param couponId 优惠券ID
     * @param status 状态
     * @return 结果
     */
    @Override
    public int updateCouponStatus(Integer couponId, Integer status) {
        return couponMapper.updateCouponStatus(couponId, status);
    }

    /**
     * 分配优惠券给用户
     *
     * @param couponId 优惠券ID
     * @param userId 用户ID
     * @return 结果
     */
    @Override
    @Transactional
    public int assignCouponToUser(Integer couponId, Integer userId) {
        // 检查优惠券是否存在且有效
        Coupon coupon = couponMapper.selectById(couponId);
        if (coupon == null || coupon.getStatus() != 1) {
            return 0;
        }

        // 检查优惠券是否在有效期内
        Date now = DateUtils.getNowDate();
        if (coupon.getStartDate().after(now) || coupon.getExpireDate().before(now)) {
            return 0;
        }

        // 检查用户是否已经拥有该优惠券
        UserCoupon existUserCoupon = userCouponMapper.selectUserCoupon(userId, couponId);
        if (existUserCoupon != null && !existUserCoupon.getIsUsed()) {
            return 0;
        }

        // 分配优惠券给用户
        UserCoupon userCoupon = new UserCoupon();
        userCoupon.setUserId(userId);
        userCoupon.setCouponId(couponId);
        userCoupon.setIsUsed(false);

        return userCouponMapper.insert(userCoupon);
    }

    /**
     * 使用优惠券
     *
     * @param userCouponId 用户优惠券ID
     * @param orderId 订单ID
     * @return 结果
     */
    @Override
    @Transactional
    public int useCoupon(Integer userCouponId, String orderId) {
        // 检查用户优惠券是否存在且未使用
        UserCoupon userCoupon = userCouponMapper.selectById(userCouponId);
        if (userCoupon == null || userCoupon.getIsUsed()) {
            return 0;
        }

        // 使用优惠券
        return userCouponMapper.useCoupon(userCouponId, orderId, new Date());
    }

    /**
     * 获取用户优惠券
     *
     * @param userCouponId 用户优惠券ID
     * @return 用户优惠券
     */
    @Override
    public UserCoupon selectUserCouponById(Integer userCouponId) {
        UserCoupon userCoupon = userCouponMapper.selectById(userCouponId);
        if (userCoupon != null) {
            // 查询优惠券信息
            Coupon coupon = couponMapper.selectById(userCoupon.getCouponId());
            userCoupon.setCoupon(coupon);
        }
        return userCoupon;
    }
}